package com.example.base_kotlin_xml.view

import androidx.lifecycle.lifecycleScope
import com.blankj.utilcode.util.LogUtils
import com.example.base_kotlin_xml.R
import com.example.base_kotlin_xml.databinding.FragmentFlowMessageQueueBinding
import com.example.base_model.utils.FlowMessageQueue
import com.example.base_model.utils.QueueSendingDataUtils
import com.example.base_model.view.BaseFragment
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

/**
 * @Author: jiangKunKun
 * @CreateDate: 2025/8/26
 * @Description: 消息队列出路
 * @SpittingGrooves
 */
class FlowMessageQueueFragment : BaseFragment<FragmentFlowMessageQueueBinding>() {
    private lateinit var messageQueue: FlowMessageQueue<String>
    val queueUtils = QueueSendingDataUtils<String>()
    override fun initObservers() {
    }

    override fun initClickEvents() {
    }

    override fun initData() {
        // 初始化消息队列
        messageQueue = FlowMessageQueue(lifecycle, 200)
        // 可选：设置背压策略
        messageQueue.setBackpressureStrategy(FlowMessageQueue.BackpressureStrategy.BUFFER)
        // 设置消息处理回调
        messageQueue.setMessageHandler { message ->
            // 处理消息
            LogUtils.d("setMessageHandler", "接收到的消息: $message")
        }

//        lifecycleScope.launch {
//            messageQueue.asFlow()
//                .filter { it.isNotEmpty() }
//                .map { it.uppercase() }
//                .debounce(500) // 注意 xxx毫秒内只处理一次
//                .collect { processedMessage ->
//                    // 自定义处理逻辑
//                    LogUtils.d("asFlow", "接收到的消息: $processedMessage")
//                }
//        }

        // 模拟推送消息
        lifecycleScope.launch {
            repeat(10) {
                delay(1000)
                messageQueue.push("Message $it")
                LogUtils.d( "push", "已推送的消息: Message $it")
            }
        }

        mBinding.btnSendMsg.setOnClickListener {
            messageQueue.push("手动推送的消息")
        }

        // 发送数据======

        // 初始化队列，传入延迟时间和发送逻辑
        queueUtils.initSendQueue(delayMillis = 2000) { msg ->
            // 在这里实现实际的发送逻辑
            LogUtils.e( "消息队列要处理的消息:  $msg")
        }

        // 发送消息
        mBinding.btnQueueSendMsg.setOnClickListener {
            queueUtils.send("艾泽拉斯")
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        // 4. 关闭资源
        queueUtils.close()
    }

    override fun attachLayoutRes(): Int = R.layout.fragment_flow_message_queue
}